package com.ingenio.dao;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ingenio.Adapter;
import com.ingenio.business.Almacen;
import com.ingenio.business.DetallePedido;
import com.ingenio.business.Movimiento;
import com.ingenio.business.Producto;
import com.ingenio.business.TipoMovimiento;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class InventarioAdapter extends Adapter{
   
	public Double devolverCantidadActual(Producto producto, Almacen almacen) throws Exception {
		Connection conn = null;
		PreparedStatement stmt = null;
		Double cantidadActual = null;
		DetallePedidoAdapter dpa = new DetallePedidoAdapter();
		List<DetallePedido> pedidosPendientes = new ArrayList<DetallePedido>();
		try {
			conn = (Connection) abrirConexion();
			String query = "SELECT cantidadInventario FROM inventario WHERE IdProducto = ? and IdAlmacen = ?";
			stmt = (PreparedStatement) conn.prepareStatement(query);
    		stmt.setString(1, producto.getIdProducto());
    		stmt.setInt(2, almacen.getIdAlmacen());
    		ResultSet result = stmt.executeQuery();
    		if (result.next()){
    			cantidadActual = result.getDouble("cantidadInventario");
    			pedidosPendientes = dpa.devolverDetallePedidosPendientes(producto);
    			Double cantidadPendienteEntrega = 0.0;
    			for (DetallePedido dp : pedidosPendientes) {
    				cantidadPendienteEntrega = cantidadPendienteEntrega + (dp.getCantidadPedida() - dp.getCantidadEntregada());
    			}
    			cantidadActual -= cantidadPendienteEntrega;
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
		finally {
			cerrarConexion(conn);
		}
		return cantidadActual;
	}
	
	public Double devolverCantidad(Producto producto, Almacen almacen, Connection conn) throws Exception {
		PreparedStatement stmt = null;
		Double cantidadActual = null;
		try {
			String query = "SELECT cantidadInventario FROM inventario WHERE IdProducto = ? and IdAlmacen = ?";
			stmt = (PreparedStatement) conn.prepareStatement(query);
    		stmt.setString(1, producto.getIdProducto());
    		stmt.setInt(2, almacen.getIdAlmacen());
    		ResultSet result = stmt.executeQuery();
    		if (result.next()){
    			cantidadActual = result.getDouble("cantidadInventario");
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
		return cantidadActual;
	}
	
	public Double devolverCantidad(Producto producto, Almacen almacen) throws Exception {
		Connection conn = null;
		PreparedStatement stmt = null;
		Double cantidadActual = null;
		try {
			conn = (Connection) abrirConexion();
			String query = "SELECT cantidadInventario FROM inventario WHERE IdProducto = ? and IdAlmacen = ?";
			stmt = (PreparedStatement) conn.prepareStatement(query);
    		stmt.setString(1, producto.getIdProducto());
    		stmt.setInt(2, almacen.getIdAlmacen());
    		ResultSet result = stmt.executeQuery();
    		if (result.next()){
    			cantidadActual = result.getDouble("cantidadInventario");
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
		finally{
			cerrarConexion(conn);
		}
		return cantidadActual;
	}
	
	public boolean actualizarInventario(Producto producto, Almacen almacen, 
			TipoMovimiento tipoMovimiento, Double cantidad, Connection conn) throws Exception{
		PreparedStatement stmt = null;
		try {
			String query ="UPDATE inventario SET cantidadInventario = ? WHERE IdProducto = ? and IdAlmacen = ?";
    		stmt = (PreparedStatement) conn.prepareStatement(query);
    		Double cantidadActual = this.devolverCantidad(producto, almacen, conn);
    		if (tipoMovimiento.getIdTipoMovimiento() == 1) {	// 1.-Ingreso  ;  2.- Egreso
    			cantidadActual += cantidad; // ( Ingreso + )
    			stmt.setDouble(1, cantidadActual);
    		} else {
    			cantidadActual -= cantidad; // ( Egreso - )
    			stmt.setDouble(1, cantidadActual);
    		}
    		stmt.setString(2, producto.getIdProducto());
    		stmt.setInt(3, almacen.getIdAlmacen());
    		stmt.execute();
		}
		catch (Exception e) {
			e.printStackTrace();
			return false;
		}
    	return true;
	}
	
	public void ajusteInventario(Movimiento m, Almacen a) throws Exception{
		Connection conn = null;
    	boolean execute = false;
    	MovimientoAdapter ma = new MovimientoAdapter();
    	try {
    		conn = (Connection) abrirConexion();
    		conn.setAutoCommit(false);
    		execute = ma.agregarMovimiento(m, a, conn);
    		if (execute){
    			conn.commit();
    		}else{
				conn.rollback();
				throw new Exception("Error al tratar de Registrar Ajuste de Inventario");
			}
    	}
    	catch(Exception e) {
    		conn.rollback();
    		e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
	}
	
}
